package org.bigdata.leo.hbase.starter.sdk;

import org.apache.hadoop.hbase.client.Mutation;
import org.apache.hadoop.hbase.client.Scan;
import org.bigdata.leo.hbase.starter.model.HBaseTableDesc;

import java.util.List;

/**
 * @author leo.jie (weixiao.me@aliyun.com)
 * @version 1.0
 * @organization bigdata
 * @website https://www.jielongping.com
 * @date 2020/3/30 9:11 下午
 * @since 1.0
 */
public interface HBaseOperations {

    /**
     * 创建表
     *
     * @param tableDesc 表描述的数据模型
     * @return 表是否创建成功
     */
    boolean createTable(HBaseTableDesc tableDesc);

    /**
     * 创建表的命名空间
     *
     * @param namespace 命名空间
     * @return 是否创建成功
     */
    boolean createNamespace(String namespace);

    /**
     * 删除表
     *
     * @param tableName 表名
     * @return 是否删除成功
     */
    boolean deleteTable(String tableName);

    /**
     * 启用表
     *
     * @param tableName 表名
     * @return 是否启用成功
     */
    boolean enableTable(String tableName);

    /**
     * 禁用表
     *
     * @param tableName 表名
     * @return 是否禁用表成功
     */
    boolean disableTable(String tableName);

    /**
     * 获取所有表名
     *
     * @return 返回所有表名列表
     */
    List<String> getTableNames();

    /**
     * 获取所有schema
     *
     * @return 所有schema
     */
    List<String> getSchemas();

    /**
     * 执行一个Admin操作
     *
     * @param action admin
     * @param <T>    返回值类型
     * @return 操作结果
     */
    <T> T execute(AdminCallback<T> action);

    /**
     * 执行一个表级别的操作
     *
     * @param tableName 表名
     * @param action    表级别的操作
     * @param <T>       返回值类型
     * @return 返回操作结果
     */
    <T> T execute(String tableName, TableCallback<T> action);

    /**
     * 批量查询
     *
     * @param tableName 表名
     * @param family    列簇
     * @param mapper    实体映射
     * @param <T>       实体类型
     * @return 返回查询结果
     */
    <T> List<T> find(String tableName, String family, final RowMapper<T> mapper);

    /**
     * find
     *
     * @param tableName 表名
     * @param family    列簇
     * @param qualifier 字段名
     * @param mapper    实体映射
     * @param <T>       返回值类型
     * @return 返回查询结果
     */
    <T> List<T> find(String tableName, String family, String qualifier, final RowMapper<T> mapper);

    /**
     * find by scan
     *
     * @param tableName 表名
     * @param scan      scan对象
     * @param mapper    实体映射
     * @param <T>       返回值类型
     * @return 返回查询结果
     */
    <T> List<T> find(String tableName, final Scan scan, final RowMapper<T> mapper);

    /**
     * get 查询
     *
     * @param tableName 表名
     * @param rowName   row key name
     * @param mapper    实体映射
     * @param <T>       返回值类型
     * @return 返回查询结果
     */
    <T> T get(String tableName, String rowName, final RowMapper<T> mapper);

    /**
     * get
     *
     * @param tableName  表名
     * @param rowName    row key name
     * @param familyName 列簇名
     * @param mapper     实体映射
     * @param <T>        返回值类型
     * @return 返回查询结果
     */
    <T> T get(String tableName, String rowName, String familyName, final RowMapper<T> mapper);

    /**
     * get
     *
     * @param tableName  表名
     * @param rowName    row key name
     * @param familyName 列簇名
     * @param qualifier  字段名
     * @param mapper     实体映射
     * @param <T>        返回值类型
     * @return 返回查询结果
     */
    <T> T get(String tableName, final String rowName, final String familyName, final String qualifier, final RowMapper<T> mapper);

    /**
     * 执行一个批量操作
     *
     * @param tableName 表名
     * @param action    批量操作
     */
    void execute(String tableName, MutatorCallback action);

    /**
     * saveOrUpdate
     *
     * @param tableName 表名
     * @param mutation  批量操作
     */
    void saveOrUpdate(String tableName, Mutation mutation);

    /**
     * saveOrUpdates
     *
     * @param tableName 表名
     * @param mutations 批量操作
     */
    void saveOrUpdates(String tableName, List<Mutation> mutations);
}
